{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0886e4c7",
   "metadata": {
    "papermill": {
     "duration": 0.005455,
     "end_time": "2025-03-03T16:04:53.997957",
     "exception": false,
     "start_time": "2025-03-03T16:04:53.992502",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "**This notebook is an exercise in the [Feature Engineering](https://www.kaggle.com/learn/feature-engineering) course.  You can reference the tutorial at [this link](https://www.kaggle.com/ryanholbrook/principal-component-analysis).**\n",
    "\n",
    "---\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fd1dc6ef",
   "metadata": {
    "papermill": {
     "duration": 0.003867,
     "end_time": "2025-03-03T16:04:54.006262",
     "exception": false,
     "start_time": "2025-03-03T16:04:54.002395",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# Introduction #\n",
    "\n",
    "In this exercise, you'll work through several applications of PCA to the [*Ames*](https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data) dataset."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d91ca2e7",
   "metadata": {
    "papermill": {
     "duration": 0.003856,
     "end_time": "2025-03-03T16:04:54.014344",
     "exception": false,
     "start_time": "2025-03-03T16:04:54.010488",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Run this cell to set everything up!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "280618bc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-03T16:04:54.024253Z",
     "iopub.status.busy": "2025-03-03T16:04:54.023731Z",
     "iopub.status.idle": "2025-03-03T16:04:57.791418Z",
     "shell.execute_reply": "2025-03-03T16:04:57.790165Z"
    },
    "papermill": {
     "duration": 3.774904,
     "end_time": "2025-03-03T16:04:57.793362",
     "exception": false,
     "start_time": "2025-03-03T16:04:54.018458",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-1-a636346ce091>:16: MatplotlibDeprecationWarning: The seaborn styles shipped by Matplotlib are deprecated since 3.6, as they no longer correspond to the styles shipped by seaborn. However, they will remain available as 'seaborn-v0_8-<style>'. Alternatively, directly use the seaborn API instead.\n",
      "  plt.style.use(\"seaborn-whitegrid\")\n"
     ]
    }
   ],
   "source": [
    "# Setup feedback system\n",
    "from learntools.core import binder\n",
    "binder.bind(globals())\n",
    "from learntools.feature_engineering_new.ex5 import *\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.feature_selection import mutual_info_regression\n",
    "from sklearn.model_selection import cross_val_score\n",
    "from xgboost import XGBRegressor\n",
    "\n",
    "# Set Matplotlib defaults\n",
    "plt.style.use(\"seaborn-whitegrid\")\n",
    "plt.rc(\"figure\", autolayout=True)\n",
    "plt.rc(\n",
    "    \"axes\",\n",
    "    labelweight=\"bold\",\n",
    "    labelsize=\"large\",\n",
    "    titleweight=\"bold\",\n",
    "    titlesize=14,\n",
    "    titlepad=10,\n",
    ")\n",
    "\n",
    "\n",
    "def apply_pca(X, standardize=True):\n",
    "    # Standardize\n",
    "    if standardize:\n",
    "        X = (X - X.mean(axis=0)) / X.std(axis=0)\n",
    "    # Create principal components\n",
    "    pca = PCA()\n",
    "    X_pca = pca.fit_transform(X)\n",
    "    # Convert to dataframe\n",
    "    component_names = [f\"PC{i+1}\" for i in range(X_pca.shape[1])]\n",
    "    X_pca = pd.DataFrame(X_pca, columns=component_names)\n",
    "    # Create loadings\n",
    "    loadings = pd.DataFrame(\n",
    "        pca.components_.T,  # transpose the matrix of loadings\n",
    "        columns=component_names,  # so the columns are the principal components\n",
    "        index=X.columns,  # and the rows are the original features\n",
    "    )\n",
    "    return pca, X_pca, loadings\n",
    "\n",
    "\n",
    "def plot_variance(pca, width=8, dpi=100):\n",
    "    # Create figure\n",
    "    fig, axs = plt.subplots(1, 2)\n",
    "    n = pca.n_components_\n",
    "    grid = np.arange(1, n + 1)\n",
    "    # Explained variance\n",
    "    evr = pca.explained_variance_ratio_\n",
    "    axs[0].bar(grid, evr)\n",
    "    axs[0].set(\n",
    "        xlabel=\"Component\", title=\"% Explained Variance\", ylim=(0.0, 1.0)\n",
    "    )\n",
    "    # Cumulative Variance\n",
    "    cv = np.cumsum(evr)\n",
    "    axs[1].plot(np.r_[0, grid], np.r_[0, cv], \"o-\")\n",
    "    axs[1].set(\n",
    "        xlabel=\"Component\", title=\"% Cumulative Variance\", ylim=(0.0, 1.0)\n",
    "    )\n",
    "    # Set up figure\n",
    "    fig.set(figwidth=8, dpi=100)\n",
    "    return axs\n",
    "\n",
    "\n",
    "def make_mi_scores(X, y):\n",
    "    X = X.copy()\n",
    "    for colname in X.select_dtypes([\"object\", \"category\"]):\n",
    "        X[colname], _ = X[colname].factorize()\n",
    "    # All discrete features should now have integer dtypes\n",
    "    discrete_features = [pd.api.types.is_integer_dtype(t) for t in X.dtypes]\n",
    "    mi_scores = mutual_info_regression(X, y, discrete_features=discrete_features, random_state=0)\n",
    "    mi_scores = pd.Series(mi_scores, name=\"MI Scores\", index=X.columns)\n",
    "    mi_scores = mi_scores.sort_values(ascending=False)\n",
    "    return mi_scores\n",
    "\n",
    "\n",
    "def score_dataset(X, y, model=XGBRegressor()):\n",
    "    # Label encoding for categoricals\n",
    "    for colname in X.select_dtypes([\"category\", \"object\"]):\n",
    "        X[colname], _ = X[colname].factorize()\n",
    "    # Metric for Housing competition is RMSLE (Root Mean Squared Log Error)\n",
    "    score = cross_val_score(\n",
    "        model, X, y, cv=5, scoring=\"neg_mean_squared_log_error\",\n",
    "    )\n",
    "    score = -1 * score.mean()\n",
    "    score = np.sqrt(score)\n",
    "    return score\n",
    "\n",
    "\n",
    "df = pd.read_csv(\"../input/fe-course-data/ames.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ab34450",
   "metadata": {
    "papermill": {
     "duration": 0.004111,
     "end_time": "2025-03-03T16:04:57.801952",
     "exception": false,
     "start_time": "2025-03-03T16:04:57.797841",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Let's choose a few features that are highly correlated with our target, `SalePrice`.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7ce38a78",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-03T16:04:57.812028Z",
     "iopub.status.busy": "2025-03-03T16:04:57.811676Z",
     "iopub.status.idle": "2025-03-03T16:04:57.843354Z",
     "shell.execute_reply": "2025-03-03T16:04:57.841957Z"
    },
    "papermill": {
     "duration": 0.038738,
     "end_time": "2025-03-03T16:04:57.845102",
     "exception": false,
     "start_time": "2025-03-03T16:04:57.806364",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Correlation with SalePrice:\n",
      "\n",
      "GarageArea      0.640138\n",
      "YearRemodAdd    0.532974\n",
      "TotalBsmtSF     0.632529\n",
      "GrLivArea       0.706780\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "features = [\n",
    "    \"GarageArea\",\n",
    "    \"YearRemodAdd\",\n",
    "    \"TotalBsmtSF\",\n",
    "    \"GrLivArea\",\n",
    "]\n",
    "\n",
    "print(\"Correlation with SalePrice:\\n\")\n",
    "print(df[features].corrwith(df.SalePrice))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e14d3596",
   "metadata": {
    "papermill": {
     "duration": 0.004148,
     "end_time": "2025-03-03T16:04:57.853706",
     "exception": false,
     "start_time": "2025-03-03T16:04:57.849558",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "We'll rely on PCA to untangle the correlational structure of these features and suggest relationships that might be usefully modeled with new features.\n",
    "\n",
    "Run this cell to apply PCA and extract the loadings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "cc737aae",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-03T16:04:57.863736Z",
     "iopub.status.busy": "2025-03-03T16:04:57.863356Z",
     "iopub.status.idle": "2025-03-03T16:04:57.920920Z",
     "shell.execute_reply": "2025-03-03T16:04:57.919635Z"
    },
    "papermill": {
     "duration": 0.064725,
     "end_time": "2025-03-03T16:04:57.922745",
     "exception": false,
     "start_time": "2025-03-03T16:04:57.858020",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                   PC1       PC2       PC3       PC4\n",
      "GarageArea    0.541229  0.102375 -0.038470  0.833733\n",
      "YearRemodAdd  0.427077 -0.886612 -0.049062 -0.170639\n",
      "TotalBsmtSF   0.510076  0.360778 -0.666836 -0.406192\n",
      "GrLivArea     0.514294  0.270700  0.742592 -0.332837\n"
     ]
    }
   ],
   "source": [
    "X = df.copy()\n",
    "y = X.pop(\"SalePrice\")\n",
    "X = X.loc[:, features]\n",
    "\n",
    "# `apply_pca`, defined above, reproduces the code from the tutorial\n",
    "pca, X_pca, loadings = apply_pca(X)\n",
    "print(loadings)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c44d657c",
   "metadata": {
    "papermill": {
     "duration": 0.004061,
     "end_time": "2025-03-03T16:04:57.931403",
     "exception": false,
     "start_time": "2025-03-03T16:04:57.927342",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# 1) Interpret Component Loadings\n",
    "\n",
    "Look at the loadings for components `PC1` and `PC3`. Can you think of a description of what kind of contrast each component has captured? After you've thought about it, run the next cell for a solution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "be7b6cc5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-03T16:04:57.941107Z",
     "iopub.status.busy": "2025-03-03T16:04:57.940708Z",
     "iopub.status.idle": "2025-03-03T16:04:57.948448Z",
     "shell.execute_reply": "2025-03-03T16:04:57.947528Z"
    },
    "papermill": {
     "duration": 0.014365,
     "end_time": "2025-03-03T16:04:57.950003",
     "exception": false,
     "start_time": "2025-03-03T16:04:57.935638",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"outcomeType\": 1, \"valueTowardsCompletion\": 0.3333333333333333, \"interactionType\": 1, \"questionType\": 4, \"questionId\": \"1_Q1\", \"learnToolsVersion\": \"0.3.4\", \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\"}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#33cc33\">Correct:</span> \n",
       "\n",
       "The first component, `PC1`, seems to be a kind of \"size\" component, similar to what we saw in the tutorial: all of the features have the same sign (positive), indicating that this component is describing a contrast between houses having large values and houses having small values for these features.\n",
       "\n",
       "The interpretation of the third component `PC3` is a little trickier. The features `GarageArea` and `YearRemodAdd` both have near-zero loadings, so let's ignore those. This component is mostly about `TotalBsmtSF` and `GrLivArea`. It describes a contrast between houses with a lot of living area but small (or non-existant) basements, and the opposite: small houses with large basements.\n"
      ],
      "text/plain": [
       "Correct: \n",
       "\n",
       "The first component, `PC1`, seems to be a kind of \"size\" component, similar to what we saw in the tutorial: all of the features have the same sign (positive), indicating that this component is describing a contrast between houses having large values and houses having small values for these features.\n",
       "\n",
       "The interpretation of the third component `PC3` is a little trickier. The features `GarageArea` and `YearRemodAdd` both have near-zero loadings, so let's ignore those. This component is mostly about `TotalBsmtSF` and `GrLivArea`. It describes a contrast between houses with a lot of living area but small (or non-existant) basements, and the opposite: small houses with large basements."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# View the solution (Run this cell to receive credit!)\n",
    "q_1.check()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "122a1243",
   "metadata": {
    "papermill": {
     "duration": 0.00414,
     "end_time": "2025-03-03T16:04:57.958674",
     "exception": false,
     "start_time": "2025-03-03T16:04:57.954534",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "-------------------------------------------------------------------------------\n",
    "\n",
    "Your goal in this question is to use the results of PCA to discover one or more new features that improve the performance of your model. One option is to create features inspired by the loadings, like we did in the tutorial. Another option is to use the components themselves as features (that is, add one or more columns of `X_pca` to `X`).\n",
    "\n",
    "# 2) Create New Features\n",
    "\n",
    "Add one or more new features to the dataset `X`. For a correct solution, get a validation score below 0.140 RMSLE. (If you get stuck, feel free to use the `hint` below!)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b22bf000",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-03T16:04:57.968903Z",
     "iopub.status.busy": "2025-03-03T16:04:57.968560Z",
     "iopub.status.idle": "2025-03-03T16:05:00.497166Z",
     "shell.execute_reply": "2025-03-03T16:05:00.496138Z"
    },
    "lines_to_next_cell": 0,
    "papermill": {
     "duration": 2.536374,
     "end_time": "2025-03-03T16:05:00.499594",
     "exception": false,
     "start_time": "2025-03-03T16:04:57.963220",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Your score: 0.13856 RMSLE\n"
     ]
    },
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"outcomeType\": 1, \"valueTowardsCompletion\": 0.3333333333333333, \"interactionType\": 1, \"questionType\": 2, \"questionId\": \"2_Q2\", \"learnToolsVersion\": \"0.3.4\", \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\"}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#33cc33\">Correct:</span> \n",
       "\n",
       "Here are two possible solutions, though you might have been able to find others.\n",
       "```python\n",
       "# Solution 1: Inspired by loadings\n",
       "X = df.copy()\n",
       "y = X.pop(\"SalePrice\")\n",
       "\n",
       "X[\"Feature1\"] = X.GrLivArea + X.TotalBsmtSF\n",
       "X[\"Feature2\"] = X.YearRemodAdd * X.TotalBsmtSF\n",
       "\n",
       "score = score_dataset(X, y)\n",
       "print(f\"Your score: {score:.5f} RMSLE\")\n",
       "\n",
       "\n",
       "# Solution 2: Uses components\n",
       "X = df.copy()\n",
       "y = X.pop(\"SalePrice\")\n",
       "\n",
       "X = X.join(X_pca)\n",
       "score = score_dataset(X, y)\n",
       "print(f\"Your score: {score:.5f} RMSLE\")\n",
       "```\n"
      ],
      "text/plain": [
       "Correct: \n",
       "\n",
       "Here are two possible solutions, though you might have been able to find others.\n",
       "```python\n",
       "# Solution 1: Inspired by loadings\n",
       "X = df.copy()\n",
       "y = X.pop(\"SalePrice\")\n",
       "\n",
       "X[\"Feature1\"] = X.GrLivArea + X.TotalBsmtSF\n",
       "X[\"Feature2\"] = X.YearRemodAdd * X.TotalBsmtSF\n",
       "\n",
       "score = score_dataset(X, y)\n",
       "print(f\"Your score: {score:.5f} RMSLE\")\n",
       "\n",
       "\n",
       "# Solution 2: Uses components\n",
       "X = df.copy()\n",
       "y = X.pop(\"SalePrice\")\n",
       "\n",
       "X = X.join(X_pca)\n",
       "score = score_dataset(X, y)\n",
       "print(f\"Your score: {score:.5f} RMSLE\")\n",
       "```"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = df.copy()\n",
    "y = X.pop(\"SalePrice\")\n",
    "\n",
    "# YOUR CODE HERE: Add new features to X.\n",
    "X = X.join(X_pca)\n",
    "\n",
    "score = score_dataset(X, y)\n",
    "print(f\"Your score: {score:.5f} RMSLE\")\n",
    "\n",
    "\n",
    "# Check your answer\n",
    "q_2.check()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3612f09c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-03T16:05:00.512180Z",
     "iopub.status.busy": "2025-03-03T16:05:00.511803Z",
     "iopub.status.idle": "2025-03-03T16:05:00.521532Z",
     "shell.execute_reply": "2025-03-03T16:05:00.520576Z"
    },
    "lines_to_next_cell": 0,
    "papermill": {
     "duration": 0.017106,
     "end_time": "2025-03-03T16:05:00.523044",
     "exception": false,
     "start_time": "2025-03-03T16:05:00.505938",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"interactionType\": 2, \"questionType\": 2, \"questionId\": \"2_Q2\", \"learnToolsVersion\": \"0.3.4\", \"valueTowardsCompletion\": 0.0, \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\", \"outcomeType\": 4}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#3366cc\">Hint:</span> Try using the `make_mi_scores` function on `X_pca` to find out which components might have the most potential. Then look at the loadings to see what kinds of relationships among the features might be important.\n",
       "\n",
       "Alternatively, you could use the components themselves. Try joining the highest scoring components from `X_pca` to `X`, or just join all of `X_pca` to `X`.\n"
      ],
      "text/plain": [
       "Hint: Try using the `make_mi_scores` function on `X_pca` to find out which components might have the most potential. Then look at the loadings to see what kinds of relationships among the features might be important.\n",
       "\n",
       "Alternatively, you could use the components themselves. Try joining the highest scoring components from `X_pca` to `X`, or just join all of `X_pca` to `X`."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"interactionType\": 3, \"questionType\": 2, \"questionId\": \"2_Q2\", \"learnToolsVersion\": \"0.3.4\", \"valueTowardsCompletion\": 0.0, \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\", \"outcomeType\": 4}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#33cc99\">Solution:</span> Here are two possible solutions, though you might have been able to find others.\n",
       "```python\n",
       "# Solution 1: Inspired by loadings\n",
       "X = df.copy()\n",
       "y = X.pop(\"SalePrice\")\n",
       "\n",
       "X[\"Feature1\"] = X.GrLivArea + X.TotalBsmtSF\n",
       "X[\"Feature2\"] = X.YearRemodAdd * X.TotalBsmtSF\n",
       "\n",
       "score = score_dataset(X, y)\n",
       "print(f\"Your score: {score:.5f} RMSLE\")\n",
       "\n",
       "\n",
       "# Solution 2: Uses components\n",
       "X = df.copy()\n",
       "y = X.pop(\"SalePrice\")\n",
       "\n",
       "X = X.join(X_pca)\n",
       "score = score_dataset(X, y)\n",
       "print(f\"Your score: {score:.5f} RMSLE\")\n",
       "```\n"
      ],
      "text/plain": [
       "Solution: Here are two possible solutions, though you might have been able to find others.\n",
       "```python\n",
       "# Solution 1: Inspired by loadings\n",
       "X = df.copy()\n",
       "y = X.pop(\"SalePrice\")\n",
       "\n",
       "X[\"Feature1\"] = X.GrLivArea + X.TotalBsmtSF\n",
       "X[\"Feature2\"] = X.YearRemodAdd * X.TotalBsmtSF\n",
       "\n",
       "score = score_dataset(X, y)\n",
       "print(f\"Your score: {score:.5f} RMSLE\")\n",
       "\n",
       "\n",
       "# Solution 2: Uses components\n",
       "X = df.copy()\n",
       "y = X.pop(\"SalePrice\")\n",
       "\n",
       "X = X.join(X_pca)\n",
       "score = score_dataset(X, y)\n",
       "print(f\"Your score: {score:.5f} RMSLE\")\n",
       "```"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Lines below will give you a hint or solution code\n",
    "q_2.hint()\n",
    "q_2.solution()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "24275cbb",
   "metadata": {
    "papermill": {
     "duration": 0.005128,
     "end_time": "2025-03-03T16:05:00.533778",
     "exception": false,
     "start_time": "2025-03-03T16:05:00.528650",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "-------------------------------------------------------------------------------\n",
    "\n",
    "The next question explores a way you can use PCA to detect outliers in the dataset (meaning, data points that are unusually extreme in some way). Outliers can have a detrimental effect on model performance, so it's good to be aware of them in case you need to take corrective action. PCA in particular can show you anomalous *variation* which might not be apparent from the original features: neither small houses nor houses with large basements are unusual, but it is unusual for small houses to have large basements. That's the kind of thing a principal component can show you.\n",
    "\n",
    "Run the next cell to show distribution plots for each of the principal components you created above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e288259f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-03T16:05:00.545697Z",
     "iopub.status.busy": "2025-03-03T16:05:00.545366Z",
     "iopub.status.idle": "2025-03-03T16:05:01.664931Z",
     "shell.execute_reply": "2025-03-03T16:05:01.663878Z"
    },
    "papermill": {
     "duration": 1.127675,
     "end_time": "2025-03-03T16:05:01.666754",
     "exception": false,
     "start_time": "2025-03-03T16:05:00.539079",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/dist-packages/seaborn/categorical.py:1794: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n",
      "  with pd.option_context('mode.use_inf_as_na', True):\n",
      "/usr/local/lib/python3.10/dist-packages/seaborn/categorical.py:1794: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n",
      "  with pd.option_context('mode.use_inf_as_na', True):\n",
      "/usr/local/lib/python3.10/dist-packages/seaborn/categorical.py:1794: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n",
      "  with pd.option_context('mode.use_inf_as_na', True):\n",
      "/usr/local/lib/python3.10/dist-packages/seaborn/categorical.py:1794: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n",
      "  with pd.option_context('mode.use_inf_as_na', True):\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAPdCAYAAACXzguGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACP10lEQVR4nOzdeXxU5aHG8Wcy2UgCqRhBK3FBGgSDEgOCyJVVg6JAuK5UFAUVUNwSBavUBQTFIGoaUQRR1Fu9KgjiEmW9WNEWDUsgEAXUQFkaMCgJk8xy7h8004xZSHDOnJnJ7/v5+GlyzpkzTyjhnWfOO++xGYZhCAAAAAAA+F2E1QEAAAAAAAhXlG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbqAZ6dixozp27Kivvvqq0Y/56quvvI9ryK5du7zH7dq167dGPS4LFy70Zqj5X3p6ukaNGqW1a9fWekxJSYkeffRRXXrppTr33HN17rnn6rLLLtPzzz+vgwcP1jr+008/1YUXXqiOHTtq0qRJgfixAAAhiDH3t425W7du1a233qrzzz9f559/voYPH65FixYF6scD/CrS6gAAAufGG2+UJJ188skWJzHfyJEjZbPZ5HK5tGHDBq1du1ZfffWVXnzxRfXp00fS0Rc348aNU3l5udq1a6chQ4aovLxcf/vb35SXl6clS5ZowYIF+v3vf69Dhw5pypQp+uCDDyz+yQAAoYAx9/jH3B9++EHXX3+9Kioq1Lt3b7Vu3Voff/yxJk2apNLSUt16660W/8RA01C6gWbkoYcesjpCwEyaNEmRkUf/ifN4PLrlllu0du1a5eXlqU+fPqqoqNB9992n8vJyDRo0SDk5OYqKipIkHTp0SDfffLM2b96sJ554Qnl5efroo4/0wQcfaPjw4Tp06JCWL19u5Y8HAAhyjLnHP+a+9tprqqioUM+ePTVv3jxJUtu2bfXyyy/rf/7nfyjdCDlMLweCwIgRI9SxY0c98MADPturp26lpaXpyJEjkqR33nlHmZmZOv/889WzZ0+NHTtW3377ba3H3HDDDXr77bfVs2dPTZ48WVLdU92WLVum6667Tt27d1f37t01cuRIff3113XmLCkp0ejRo5WWlqaePXtq5syZ8ng8Df5sq1at0siRI9WjRw+lpaVp9OjR+u677+o9vuaUufr+a8pUPUmKiIhQ//79JUlbtmyRJH300UcqLS1VVFSUHn30Ue/gL0mJiYmaOnWqHnzwQU2cOFGSdMopp+iVV17R9OnT1apVqyY9PwAgeDDm/kewjrnXXHONFixYoKlTp3qPS0pKkiT961//alIeIBhwpRsIAoMHD9bXX3+t1atXy+12y263S5I+++wzSdIll1yiFi1a6K233tIjjzyimJgYXXHFFfrxxx+1cuVKFRUV6cMPP1RCQoL3nLt27dKsWbPUr18/denSpc7n/b//+z/deeedstlsGjx4sH755RetWrVKt956q5YuXarf//73PsePHz9eZ511ls4//3x9/vnnmjNnjtq0aaORI0fWef4VK1Zo/PjxioiI0MCBA2Wz2fTpp59q5MiR+vDDD9W6detaj0lISPBOyavP8UzVc7vdkuR9J776Rc7ZZ5+tE044odbxnTt3VufOnb3f9+3bt8nPCQAIPoy5/xGsY+7ZZ5/ts7+qqkrvv/++JOn0009vch7AapRuIAhcdtllmjZtmsrKylRQUKBu3brpyJEj+uKLLyRJQ4YMkSQ5HA5de+21Ov/88zVs2DA5nU5dcMEF2rt3r9avX6/evXt7z7lnzx7NmTPH+1mquhw8eFDXXHON2rdvr1GjRkmSBg0apJ07d2rNmjW69tprfY7PzMzULbfcIkm655579PHHH+t//ud/6n0B8Oyzz8owDI0ZM0b33XefJOmZZ57RSy+9pDfffFMTJkyo9Zjf/e53fp+S53a79emnn0qSunXrJknav3+/pKPT1QAAzQdj7n+Ewpjr8Xj05z//WUVFRZLE1HKEJEo3EARat26tCy+8UGvWrNGKFSvUrVs3ff7553I4HDrppJN04YUXSpJGjRqldevWad26dZo2bZoMw5DNZpNUe7pVbGysLr744gafd9iwYTr77LO1Zs0aTZ8+XR6PRxUVFXWeT5KGDh3q/bp///76+OOPtXPnTlVVVdU69vDhw9q2bZskqbi4WE888YQk6fvvv5ckbdy4sTF/NMftySeflM1mk9vtVkFBgbZs2aLY2Fjdc889kuT9c6t+Nx4A0Dww5vqfWWOu2+3WxIkTvYuYDh06VMOGDfNndCAgKN1AkLjiiiu0Zs0arVy5Ug888ICWLVsm6eg0uOqpb1OmTNEbb7xR5+MNw/D5/oQTTvAOcvWZN2+eZsyY0ajzSUffEa+WmJjoPe7QoUO1ji0vL/d+vXLlylr79+7dW+fzlpWVKS8vr8HcN9xwwzGnl73++uverxMSEtSnTx/dfffdOueccyTJO41v3759DZ4HABB+GHOPCuYx1+PxKCsrSx9//LEk6dprr9Wjjz7a6McDwYTSDQSJgQMHKiYmRjt27ND27du1atUqSf+Z5vbjjz96B/977rlHN998s2JjY3XRRReptLS01vkiIhpeJ9HhcGjWrFmSpOuuu07333+/EhISdM0112jDhg11PubQoUPez4T99NNP3uc54YQTag3oLVu2lM1mk2EYysvL08CBAxv153D48GEtWLCgwWMGDhx4zBcAmzdv9n6WrC49e/bU22+/raKiIv3www+1zldYWKgnnnhCI0aM0ODBg4/55wkACB2MuUcF85j7zDPPeAt3VlaWbrvttkb9TEAw4lUkECQSEhK8i3U9/fTTKisr01lnneV9l7isrMx7bJ8+fRQbG6t169Z5B/+6pps1pKKiQk6nU5LUu3dvJSQk6IcffvB+Zqqu8y1ZssT7dfVVgT/84Q91DrRxcXHq1KmTJGnNmjXe7atXr9bcuXO1du3aOnO1a9dO27Zta/C/Hj16NOlnrcvAgQN12mmnyTAMTZs2TZWVld59ZWVlmjx5sr755hv97//+L4UbAMIMY+5RwTrmfvPNN3r55ZclHb31GoUboY4r3UAQueKKK5Sfn++dGlb9jrsktW/fXgkJCTp8+LD+9Kc/KSUlRatXr1bfvn21atUqvfrqq4qNjW30c7Vu3VrJyckqKSnRjBkztGLFCq1atUoXX3yxli1bpsWLF+vEE0/0DuI2m01vvPGGNmzYoLKyMu+CMzfddFO9z3HHHXfozjvv1FtvvaXdu3erZcuWWrFihVwul+bOnXs8f0R+Ex0dreeee06jR4/WqlWrlJGRoV69eqmyslJffPGFDh48qNNOO807FfCDDz7Q0qVLJUlbt26VJK1du1a33367JOm+++5Tx44drflhAABNxpgbOE0dc6tnBcTExKikpMT7GfVqd9xxh8/0eyDYUbqBINKnTx/vIG+z2XTllVd69yUkJGjWrFmaMWOGduzYIcMw9Mwzz+j3v/+9du7cqV27dunHH39Uu3btGv18zzzzjB5//HF9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+fn5stlsde6z2WzKz88PcCIANQVF6V6zZo169eqle++9t9a+jz76SFdeeaXS0tI0fPhwff755/Wep6ysTPfcc4969eql3r1766GHHpLD4TAzOgAAAGCpjIwMGYZR5z7DMDRo0KAAJwJQk+Wl++WXX9bUqVN1+umn19pXVFSkiRMnKjs7W19++aVGjRqlO++8U3v37q3zXJMnT9aRI0e0dOlSvffee9q+fbtycnLM/hEAAAAAy6Slpal///6KiPB9aR8REaEBAwaoa9eu1gQDICkISndMTIzefffdOkv3O++8oz59+qhPnz6KiYnRkCFDlJKSoiVLltQ6trS0VMuWLdO9996r1q1bq23btho/frzee++9WotKAAAAAOFk/PjxioqK8tkWFRWlcePGWZQIQDXLP2R544031rtv8+bN6tOnj8+2zp07a9OmTbWOLSoqkt1uV8eOHb3bzjnnHFVUVGjHjh0+22tyu91yu93HmR4AgOBkt9utjgAggJKSkjR69Gi98MIL3m1jxoxRUlKShakASEFQuhtSVlamxMREn22JiYn67rvv6jw2ISHBZxGJ6sf+9NNP9T5HcXGxn9ICABA80tPTrY4AIMCGDx+uDz74QCUlJUpOTlZmZqbVkQAoyEu3pHoXhfitx1ZLSUlRXFxckx8HAAAABJPIyEhlZWXpoYceUnZ2NncOAYJEUP8mnnDCCSorK/PZVlZWptatW9c6tnXr1jp8+LDcbrd3Sl31Y0888cR6n8NutzMFDwAAAGGha9euWrx4MYUbCCKWL6TWkNTUVBUWFvps27Rpk84777xax3bq1EmGYWjr1q0+x7Zq1Upnnnmm6VkBAACAYEDhBoJLUJfua665Rl988YVWrVqlyspKvfvuu/r+++81ZMgQSdJnn32mESNGSDp6pTsjI0PPPvusDh48qL179yovL09XXXUV//AAAAAAACxheRvt0qWLJMnlckmSli1bJunoVeqUlBTl5ORo+vTp2r17tzp06KCXXnpJJ510kiTpl19+0Q8//OA91+OPP65HHnlEAwYMUFRUlK644grde++9Af6JAAAAAAA4ymYcz+pjYaCiokJFRUXq1KkTC6kBAGASxlsAQHMX1NPLAQAAAAAIZZRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATELpBgAAAADA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6b7++uvlcDj05z//WR9++KEkadiwYZo5c6bcbrdGjRrlt3Annnii3n77bc2ZM0dVVVXauXOnnnvuOV177bWy2+0aNGiQ1q1b5831/vvva/369Tpy5Ihmz56t6Oho9e3b1295ADTNrbfe6v06JjbW+/WYMWOsiAPAj7755htNnDhRzz333DELNwD/cjgctQr3sRQWFvpcFQcQOE2+0j1s2DAdPnxYubm5OnTokHf7CSecoPHjx3uvNPtD27ZtNWfOHM2cOdNbojMzM3XvvfdKknbu3KmKigpJ0sUXX6z77rtP99xzjw4cOKAuXbpozpw5iq3xQh9AYJ144olN2g4gNLhcLj388MPKzs5W7969rY4DNGu3TZ6pqOj6P7PtrKrUnClZAUwE4NeO6z7dN9xwg0aMGKHt27frl19+UWJios4880xFRDT5wvkxde/eXW+99Vad+7Zt2+bz/YgRIzRixAi/ZwAAAP+xfv16bd++XVOnTtXUqVN99n3yySc69dRTLUoGND9R0TENlm4A1juu0i0dXTSNRcoAAGh+unXrVuuNbwAAULcml+5OnTo1uN9ms2nLli3HHQgAAAAAgHBxXLcM+y37AQAAAABoLppcuhcsWFBr28GDB/XRRx/pn//8p5566im/BAMAAAAAINQ1uXRfcMEFdW4fNGiQxo4dq9dee02PP/74bw4GAAAAAECo8+ty46eccory8/P9eUoAIcowDJ/7gVZWVvrsAwAAAJqDJl/p/sc//lFrW2VlpTZs2KB3331XkZHHvSA6gDBhGIYmTJigwsJC77bsO279z9fZ2crLy5PNZrMiHgAAABAwTW7II0eOrPeFsmEYuvTSS39zKAChzeFw+BTuX9uyZYscDodatGgRwFQAAISmX88eq/m1s6qyrofUub/m46rFxsbyJjhgsuO6LP3rqaERERFKSkpS//79lZ2d7ZdgAMLD5JkvKjomRpJUVVmpKVljLU4EAEDoqGv2WE1zpmQ1+lyZmZm1tqWmpio3N5fiDZioyaV769atZuQAEKaiY2IUHRNrdQwAAELSsWaP/VaFhYXMPgNMxgewAQAAgBAw9K4pioyK9su5XM4qLX5+sl/OBaBhjSrdAwYMaPQJbTabli1bdtyBAAAAANQWGRWtyOgYq2MAaKJGle7du3c3+oR8HgRo3n692EtVjVuF1fy6+hgWcAEA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MqTO8ycmJuqMM85QTEyM5VcBAAAwQ2xsrNURGG8BAGHvWONt0Jbu2NhYzZ07V08++aQuvvhiSdIll1yiBx980HtMSUmJDh06JOnogmg5OTmaPn26du/erQ4dOuill17SSSedVOf5IyMj61wFHQAA+A/jLQCgubMZx7P6GAAAAAAAOCbmeQEAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjfQjHTs2FEdO3bUV1991ejHfPXVV97HNWTXrl3e43bt2vVbox6XhQsXejPU/C89PV2jRo3S2rVraz2mpKREjz76qC699FKde+65Ovfcc3XZZZfp+eef18GDB32O/fvf/67Ro0erR48e6tKli4YNG6a33norUD8eACCEMOb+tjG3pjvvvNPynxf4LSKtDgAgcG688UZJ0sknn2xxEvONHDlSNptNLpdLGzZs0Nq1a/XVV1/pxRdfVJ8+fSQdfXEzbtw4lZeXq127dhoyZIjKy8v1t7/9TXl5eVqyZIkWLFig3//+9/ryyy81evRoeTweXXLJJXI6nVqxYoUeeeQRORwOjRo1ytofGAAQVBhzj3/MrWnVqlX67LPPrPixAL+hdAPNyEMPPWR1hICZNGmSIiOP/hPn8Xh0yy23aO3atcrLy1OfPn1UUVGh++67T+Xl5Ro0aJBycnIUFRUlSTp06JBuvvlmbd68WU888YTy8vL08ssvy+Vy6eabb9akSZMkSXfffbc++eQTLV26lNINAPDBmHv8Y261yspKTZ06VdHR0aqqqrLkZwP8genlQBAYMWKEOnbsqAceeMBne/XUrbS0NB05ckSS9M477ygzM1Pnn3++evbsqbFjx+rbb7+t9ZgbbrhBb7/9tnr27KnJkydLqnuq27Jly3Tdddepe/fu6t69u0aOHKmvv/66zpwlJSUaPXq00tLS1LNnT82cOVMej6fBn23VqlUaOXKkevToobS0NI0ePVrfffddvcfXnDJX339NmaonSREREerfv78kacuWLZKkjz76SKWlpYqKitKjjz7qHfwlKTExUVOn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iSeeULt27QL9IwC/CffpBoJInz59vLcgsdlsuvLKK737EhISNGvWLP3hD3/Qjh07tG3bNj3zzDOaNGmSTj/9dO3atUs//vhjk57vmWeeUZcuXbR//3598803euihhzRlyhR17txZBw8e1LZt27yLnsTHx+uFF17Q3r17tW7dOrVp00b33nuv/vu//7ve8w8cOFAvvPCCzjvvPP3973/X8uXLdc4552jevHl1vuMeaJ07d9bSpUs1evRoxcXF6aOPPtKnn36qE044QXfffbfee+89nXLKKZKka665Rjk5OUpNTdWaNWv06aef6owzztDEiROVnZ1t8U8CAGgqxtzAasqYC4Qbm1HXyg0AAAAAAOA340o3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJqF0AwAAAABgEko3AAAAAAAmoXQDAAAAAGASSjcAAAAAACahdAMAAAAAYBJKNwAAAAAAJmm2pdvj8aiiokIej8fqKAAAhC3GWwBAc9dsS7fD4VBRUZEcDofVUQAACFuMtwCA5q7Zlm4AAAAAAMxG6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAAAAAExC6QYAAAAAwCSUbgAAAAAATELpBgAAAADAJJRuAAAAAABMQukGAAAAAMAklG4AAeFyuayOAABAs8CYCwSXsCvdHTt2VGpqqrp06eL9b8qUKVbHApq19evXa+jQodqwYYPVUQAACGuMuUDwibQ6gBk++eQTtWvXzuoYAHT03facnByVl5crJydH8+fPV2RkWP7TAwCApRhzgeDU7H8L3W633G631TGAsPXuu+9q165dkqSSkhK99957uuqqqyxOBYQ/u91udQQAAbZw4UKfMXfRokW6+uqrLU4FICxL98yZM1VQUKDDhw/rsssu06RJkxQfH1/nscXFxQFOBzQfhw4d0rx583y2zZ07VyeddJISExMtSgU0D+np6VZHABBApaWldY65/fr1U1JSkkWpAEhhWLq7du2qXr166amnnlJJSYnuuecePfbYY5oxY0adx6ekpCguLi7AKYHmYerUqbVmkrjdbq1Zs0YPP/ywRakAAAg/eXl5cjqdPtucTqdmz56tyZMnW5QKgCTZDMMwrA5hptWrV2vcuHFav369oqOjvdsrKipUVFSk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4sUXXzztdaVA+vr6+qK9vT0iItrb26O3tzfjRADQuDZ9af304927d2eYBDipOesAF0qSJHHPPffMGBsdHY2LL774jHduLJfLUS6X044H81aSJHHXXXfFtm3b4mtf+1okSeI9BzWQy+WyjgDUSKFQiI997GPx+9//fsb4j3/847jhhhucYQYZa5jS/Z+OHj0aDz74YGzatOmMzzt06FCNEsH89vWvfz0qlUrs378/6ygwL6xYsSLrCECNJEkSl156aRw8eHDGGZ6lUil27twZ27ZtyzAdUFele3h4ODZv3jzrse3bt0dfX19ERBw+fDj6+/ujt7c31qxZc8bXXLp0aSxcuPCCZwUAgFooFovx3HPPvWO8UqnEnj174sYbb4yurq7aBwMios5Kd09PT/T09JzxOS+99FKsW7cubr/99rjjjjvO+pq5XM4peAAA1K2RkZFIkmTW+xglSRIjIyNKN2SoYW6kFhHx2muvxfr162PLli3nVLgBAKDedXd3n/bGwdVqNVavXl3jRMCpGqp033vvvXHzzTdPn2YOAACNrqurK1auXBlNTTP/tG9qaopVq1ZFZ2dnNsGAiGig0j06Ohr79u2LJ554IpYvXz7j64UXXsg6HgAApGZgYCCam2deOdrc3BwbNmzIKBFwUl1d030ml112WRw8eDDrGAAAUHNtbW3xiU98In7zm99Mj1199dW2C4M5oGFWugEAYL4aGxuLF198ccbYb3/72xgbG8soEXCS0g0AAHVuaGgopqamZoxNTU3Fzp07M0oEnKR0AwBAHSsWi7F3796oVCozxk/u010sFjNKBkQo3QAAUNdO7tM9m5P7dAPZUboBAKCO2acb5jalGwAA6ph9umFuU7oBAKDODQwMRD6fnzGWz+ft0w1zgNINAAB1rq2tLfr7+2eMrV271j7dMAco3QAA0AD6+vqivb09IiLa29ujt7c340RAhNINAAANobm5OTZu3BiLFi2KTZs2RXNzc9aRgIjwTgQAgAbR2dkZw8PDCjfMIVa6AQCggSjcMLco3QAAAJASpRsAAABSonQDAABASpRuAAAASInSDQAAAClRugEAACAlSjcAAACkROkGAACAlCjdAAAAkBKlGwAAAFKidAMAAEBKlG4AAGggpVIp6wjAKZRuAABoEPv374+enp44cOBA1lGAf1G6AQCgAZRKpRgcHIzj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\n",
      "text/plain": [
       "<Figure size 1000x1000 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.catplot(\n",
    "    y=\"value\",\n",
    "    col=\"variable\",\n",
    "    data=X_pca.melt(),\n",
    "    kind='boxen',\n",
    "    sharey=False,\n",
    "    col_wrap=2,\n",
    ");"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e160fa6",
   "metadata": {
    "papermill": {
     "duration": 0.00608,
     "end_time": "2025-03-03T16:05:01.679158",
     "exception": false,
     "start_time": "2025-03-03T16:05:01.673078",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "As you can see, in each of the components there are several points lying at the extreme ends of the distributions -- outliers, that is.\n",
    "\n",
    "Now run the next cell to see those houses that sit at the extremes of a component:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "ee70c7c0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-03T16:05:01.693374Z",
     "iopub.status.busy": "2025-03-03T16:05:01.692948Z",
     "iopub.status.idle": "2025-03-03T16:05:01.716746Z",
     "shell.execute_reply": "2025-03-03T16:05:01.715717Z"
    },
    "papermill": {
     "duration": 0.033237,
     "end_time": "2025-03-03T16:05:01.718605",
     "exception": false,
     "start_time": "2025-03-03T16:05:01.685368",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SalePrice</th>\n",
       "      <th>Neighborhood</th>\n",
       "      <th>SaleCondition</th>\n",
       "      <th>GarageArea</th>\n",
       "      <th>YearRemodAdd</th>\n",
       "      <th>TotalBsmtSF</th>\n",
       "      <th>GrLivArea</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1498</th>\n",
       "      <td>160000</td>\n",
       "      <td>Edwards</td>\n",
       "      <td>Partial</td>\n",
       "      <td>1418.0</td>\n",
       "      <td>2008</td>\n",
       "      <td>6110.0</td>\n",
       "      <td>5642.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2180</th>\n",
       "      <td>183850</td>\n",
       "      <td>Edwards</td>\n",
       "      <td>Partial</td>\n",
       "      <td>1154.0</td>\n",
       "      <td>2009</td>\n",
       "      <td>5095.0</td>\n",
       "      <td>5095.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2181</th>\n",
       "      <td>184750</td>\n",
       "      <td>Edwards</td>\n",
       "      <td>Partial</td>\n",
       "      <td>884.0</td>\n",
       "      <td>2008</td>\n",
       "      <td>3138.0</td>\n",
       "      <td>4676.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1760</th>\n",
       "      <td>745000</td>\n",
       "      <td>Northridge</td>\n",
       "      <td>Abnorml</td>\n",
       "      <td>813.0</td>\n",
       "      <td>1996</td>\n",
       "      <td>2396.0</td>\n",
       "      <td>4476.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1767</th>\n",
       "      <td>755000</td>\n",
       "      <td>Northridge</td>\n",
       "      <td>Normal</td>\n",
       "      <td>832.0</td>\n",
       "      <td>1995</td>\n",
       "      <td>2444.0</td>\n",
       "      <td>4316.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>662</th>\n",
       "      <td>59000</td>\n",
       "      <td>Old_Town</td>\n",
       "      <td>Normal</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1950</td>\n",
       "      <td>416.0</td>\n",
       "      <td>599.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2679</th>\n",
       "      <td>80500</td>\n",
       "      <td>Brookside</td>\n",
       "      <td>Normal</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1950</td>\n",
       "      <td>0.0</td>\n",
       "      <td>912.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2879</th>\n",
       "      <td>51689</td>\n",
       "      <td>Iowa_DOT_and_Rail_Road</td>\n",
       "      <td>Abnorml</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1950</td>\n",
       "      <td>0.0</td>\n",
       "      <td>729.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>780</th>\n",
       "      <td>63900</td>\n",
       "      <td>Sawyer</td>\n",
       "      <td>Normal</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1950</td>\n",
       "      <td>0.0</td>\n",
       "      <td>660.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1901</th>\n",
       "      <td>39300</td>\n",
       "      <td>Brookside</td>\n",
       "      <td>Normal</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1950</td>\n",
       "      <td>0.0</td>\n",
       "      <td>334.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2930 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      SalePrice            Neighborhood SaleCondition  GarageArea  \\\n",
       "1498     160000                 Edwards       Partial      1418.0   \n",
       "2180     183850                 Edwards       Partial      1154.0   \n",
       "2181     184750                 Edwards       Partial       884.0   \n",
       "1760     745000              Northridge       Abnorml       813.0   \n",
       "1767     755000              Northridge        Normal       832.0   \n",
       "...         ...                     ...           ...         ...   \n",
       "662       59000                Old_Town        Normal         0.0   \n",
       "2679      80500               Brookside        Normal         0.0   \n",
       "2879      51689  Iowa_DOT_and_Rail_Road       Abnorml         0.0   \n",
       "780       63900                  Sawyer        Normal         0.0   \n",
       "1901      39300               Brookside        Normal         0.0   \n",
       "\n",
       "      YearRemodAdd  TotalBsmtSF  GrLivArea  \n",
       "1498          2008       6110.0     5642.0  \n",
       "2180          2009       5095.0     5095.0  \n",
       "2181          2008       3138.0     4676.0  \n",
       "1760          1996       2396.0     4476.0  \n",
       "1767          1995       2444.0     4316.0  \n",
       "...            ...          ...        ...  \n",
       "662           1950        416.0      599.0  \n",
       "2679          1950          0.0      912.0  \n",
       "2879          1950          0.0      729.0  \n",
       "780           1950          0.0      660.0  \n",
       "1901          1950          0.0      334.0  \n",
       "\n",
       "[2930 rows x 7 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# You can change PC1 to PC2, PC3, or PC4\n",
    "component = \"PC1\"\n",
    "\n",
    "idx = X_pca[component].sort_values(ascending=False).index\n",
    "df.loc[idx, [\"SalePrice\", \"Neighborhood\", \"SaleCondition\"] + features]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56204ba6",
   "metadata": {
    "papermill": {
     "duration": 0.00633,
     "end_time": "2025-03-03T16:05:01.731822",
     "exception": false,
     "start_time": "2025-03-03T16:05:01.725492",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# 3) Outlier Detection\n",
    "\n",
    "Do you notice any patterns in the extreme values? Does it seem like the outliers are coming from some special subset of the data?\n",
    "\n",
    "After you've thought about your answer, run the next cell for the solution and some discussion."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "7a906545",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-03T16:05:01.747356Z",
     "iopub.status.busy": "2025-03-03T16:05:01.746914Z",
     "iopub.status.idle": "2025-03-03T16:05:01.754163Z",
     "shell.execute_reply": "2025-03-03T16:05:01.753296Z"
    },
    "papermill": {
     "duration": 0.016684,
     "end_time": "2025-03-03T16:05:01.755739",
     "exception": false,
     "start_time": "2025-03-03T16:05:01.739055",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "parent.postMessage({\"jupyterEvent\": \"custom.exercise_interaction\", \"data\": {\"outcomeType\": 1, \"valueTowardsCompletion\": 0.3333333333333333, \"interactionType\": 1, \"questionType\": 4, \"questionId\": \"3_Q3\", \"learnToolsVersion\": \"0.3.4\", \"failureMessage\": \"\", \"exceptionClass\": \"\", \"trace\": \"\"}}, \"*\")"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<span style=\"color:#33cc33\">Correct:</span> \n",
       "\n",
       "Notice that there are several dwellings listed as `Partial` sales in the `Edwards` neighborhood that stand out. A partial sale is what occurs when there are multiple owners of a property and one or more of them sell their \"partial\" ownership of the property.\n",
       "\n",
       "These kinds of sales are often happen during the settlement of a family estate or the dissolution of a business and aren't advertised publicly. If you were trying to predict the value of a house on the open market, you would probably be justified in removing sales like these from your dataset -- they are truly outliers.\n"
      ],
      "text/plain": [
       "Correct: \n",
       "\n",
       "Notice that there are several dwellings listed as `Partial` sales in the `Edwards` neighborhood that stand out. A partial sale is what occurs when there are multiple owners of a property and one or more of them sell their \"partial\" ownership of the property.\n",
       "\n",
       "These kinds of sales are often happen during the settlement of a family estate or the dissolution of a business and aren't advertised publicly. If you were trying to predict the value of a house on the open market, you would probably be justified in removing sales like these from your dataset -- they are truly outliers."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# View the solution (Run this cell to receive credit!)\n",
    "q_3.check()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af2629ec",
   "metadata": {
    "papermill": {
     "duration": 0.006654,
     "end_time": "2025-03-03T16:05:01.769509",
     "exception": false,
     "start_time": "2025-03-03T16:05:01.762855",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# Keep Going #\n",
    "\n",
    "[**Apply target encoding**](https://www.kaggle.com/ryanholbrook/target-encoding) to give a boost to categorical features."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c039dc25",
   "metadata": {
    "papermill": {
     "duration": 0.006741,
     "end_time": "2025-03-03T16:05:01.783170",
     "exception": false,
     "start_time": "2025-03-03T16:05:01.776429",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "---\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "*Have questions or comments? Visit the [course discussion forum](https://www.kaggle.com/learn/feature-engineering/discussion) to chat with other learners.*"
   ]
  }
 ],
 "metadata": {
  "jupytext": {
   "cell_metadata_filter": "-all",
   "formats": "ipynb"
  },
  "kaggle": {
   "accelerator": "none",
   "dataSources": [
    {
     "datasetId": 933090,
     "sourceId": 1828856,
     "sourceType": "datasetVersion"
    }
   ],
   "isGpuEnabled": false,
   "isInternetEnabled": false,
   "language": "python",
   "sourceType": "notebook"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "papermill": {
   "default_parameters": {},
   "duration": 11.369178,
   "end_time": "2025-03-03T16:05:02.511331",
   "environment_variables": {},
   "exception": null,
   "input_path": "__notebook__.ipynb",
   "output_path": "__notebook__.ipynb",
   "parameters": {},
   "start_time": "2025-03-03T16:04:51.142153",
   "version": "2.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
